/* eslint-disable no-unused-vars */
/**
 * 全站路由配置
 *
 * 建议:
 * 1. 代码中路由统一使用name属性跳转(不使用path属性)
 */
import * as Api from "@/api/api";
import Vue from "vue";
import Router from "vue-router";
import { isURL } from "@/utils/validate";
import { clearLoginInfo, isAuth } from "@/utils";

import routeConf from "./routesConf";
import Store from "../store";
const originalPush = Router.prototype.push;
Router.prototype.push = function push(location) {
  return originalPush.call(this, location).catch(err => err);
};

Vue.use(Router);

// 开发环境不使用懒加载, 因为懒加载页面太多的话会造成webpack热更新太慢, 所以只有生产环境使用懒加载
const _import = require("./import-" + process.env.NODE_ENV);

// 全局路由(无需嵌套上左右整体布局)
const globalRoutes = [
  {
    path: "/404",
    component: _import("common/404"),
    name: "404",
    meta: { title: "404未找到" }
  },
  {
    path: "/login",
    component: _import("common/login"),
    name: "login",
    meta: { title: "登录" }
  }
];

// 主入口路由(需嵌套上左右整体布局)
const mainRoutes = {
  path: "/",
  component: _import("main"),
  name: "main",
  redirect: { name: "home" },
  meta: { title: "主入口整体布局" },
  children: [
    // 通过meta对象设置路由展示方式
    // 1. isTab: 是否通过tab展示内容, true: 是, false: 否
    // 2. iframeUrl: 是否通过iframe嵌套展示内容, '以http[s]://开头': 是, '': 否
    // 提示: 如需要通过iframe嵌套展示内容, 但不通过tab打开, 请自行创建组件使用iframe处理!
    {
      path: "/home",
      component: _import("common/home"),
      name: "home",
      meta: { title: "首页" }
    },

    {
      path: "/theme",
      component: _import("common/theme"),
      name: "theme",
      meta: { title: "主题" }
    },
    ...routeConf
  ],
  beforeEnter(to, from, next) {
    let token = Store.state.user.token;
    // console.log(ss);
    // let token = Vue.cookie.get("token");
    if (!token || !/\S/.test(token)) {
      clearLoginInfo();
      next({ name: "login" });
    }
    next();
  }
};

const router = new Router({
  mode: "hash",
  scrollBehavior: () => ({ y: 0 }),
  isAddDynamicMenuRoutes: false, // 是否已经添加动态(菜单)路由
  routes: globalRoutes.concat(mainRoutes)
});
router.beforeEach(async (to, from, next) => {
  // 添加动态(菜单)路由
  // 1. 已经添加 or 全局路由, 直接访问
  // 2. 获取菜单列表, 添加并保存本地存储
  if (fnCurrentRouteType(to, globalRoutes) === "global") {
    if (router.options.isAddDynamicMenuRoutes) {
      next({ name: "home" });
    } else {
      next();
    }
  } else {
    if (router.options.isAddDynamicMenuRoutes) {
      if (isAuth("info:newsdetails:list")) {
        Store.dispatch("user/updateMsgCount");
      }
      next();
    } else {
      // let token = Vue.cookie.get("token");
      let token = Store.state.user.token;
      if (!token) return next({ name: "login" });
      const [err, res] = await Api.Menus.nav();
      if (!err) {
        fnAddDynamicMenuRoutes(res.menuList);
        router.options.isAddDynamicMenuRoutes = true;
        sessionStorage.setItem(
          "menuList",
          JSON.stringify(res.menuList || "[]")
        );
        sessionStorage.setItem(
          "permissions",
          JSON.stringify(res.permissions || "[]")
        );
        next({ ...to, replace: true });
      } else {
        sessionStorage.setItem("menuList", "[]");
        sessionStorage.setItem("permissions", "[]");
        next();
      }
    }
  }
});

/**
 * 判断当前路由类型, global: 全局路由, main: 主入口路由
 * @param {*} route 当前路由
 */
function fnCurrentRouteType(route, globalRoutes = []) {
  var temp = [];
  for (var i = 0; i < globalRoutes.length; i++) {
    if (route.path === globalRoutes[i].path) {
      return "global";
    } else if (
      globalRoutes[i].children &&
      globalRoutes[i].children.length >= 1
    ) {
      temp = temp.concat(globalRoutes[i].children);
    }
  }
  return temp.length >= 1 ? fnCurrentRouteType(route, temp) : "main";
}

/**
 * 添加动态(菜单)路由
 * @param {*} menuList 菜单列表
 * @param {*} routes 递归创建的动态(菜单)路由
 */
function fnAddDynamicMenuRoutes(menuList = [], routes = []) {
  var temp = [];
  for (var i = 0; i < menuList.length; i++) {
    if (menuList[i].list && menuList[i].list.length >= 1) {
      temp = temp.concat(menuList[i].list);
    } else if (menuList[i].url && /\S/.test(menuList[i].url)) {
      menuList[i].url = menuList[i].url.replace(/^\//, "");
      var route = {
        path: menuList[i].url.replace("/", "-"),
        component: null,
        name: menuList[i].url,
        meta: {
          menuId: menuList[i].menuId,
          title: menuList[i].menuName,
          isDynamic: true,
          isTab: true,
          iframeUrl: ""
        }
      };
      // url以http[s]://开头, 通过iframe展示
      if (isURL(menuList[i].url)) {
        route["path"] = `i-${menuList[i].menuId}`;
        route["name"] = `i-${menuList[i].menuId}`;
        route["meta"]["iframeUrl"] = menuList[i].url;
      } else {
        try {
          route["component"] = _import(`modules/${menuList[i].url}`) || null;
          // eslint-disable-next-line no-empty
        } catch (e) {}
      }
      routes.push(route);
    }
  }
  if (temp.length >= 1) {
    fnAddDynamicMenuRoutes(temp, routes);
  } else {
    mainRoutes.name = "main-dynamic";
    mainRoutes.children = routes;
    router.addRoutes([mainRoutes, { path: "*", redirect: { name: "404" } }]);
    sessionStorage.setItem(
      "dynamicMenuRoutes",
      JSON.stringify(mainRoutes.children || "[]")
    );
    // console.log("\n");
    // console.log(
    //   "%c!<-------------------- 动态(菜单)路由 s -------------------->",
    //   "color:blue"
    // );
    // console.log(mainRoutes.children);
    // console.log(
    //   "%c!<-------------------- 动态(菜单)路由 e -------------------->",
    //   "color:blue"
    // );
  }
}

export default router;
